package com.hxexp.weixin.common.date;

import java.util.Calendar;
import java.util.Locale;

import org.joda.time.LocalDate;

import com.hxexp.weixin.constant.StringConstant;

/**
 * 日期工具类
 * @author li.jiang
 *
 */
public final class CalendarUtil {

    private CalendarUtil() {
    }
    /**
     * 当前月的天数
     *
     * @return 天数
     */
    public static int getDaysOfMonth() {
        LocalDate now = LocalDate.now();
        return getDaysOfMonth(now.getYear(), now.getMonthOfYear());
    }
    /**
     * 指定月的天数
     * @param year 年
     * @param month 月
     * @return 天数
     */
    public static int getDaysOfMonth(int year, int month) {
        LocalDate date = new LocalDate(year, month, 1);
        return date.plusMonths(1).minusDays(1).getDayOfMonth();
    }
    /**
     * 指定月的星期数
     * @param year 年
     * @param month 月
     * @return 星期数
     */
    public static int getWeeksOfMonth(int year, int month) {
        LocalDate date = new LocalDate(year, month, 1);
        Calendar calendar = date.toDateTimeAtStartOfDay().toCalendar(Locale.CHINA);
        calendar.roll(Calendar.DATE, -1);
        return calendar.get(Calendar.WEEK_OF_MONTH);
    }
    /**
     * 当前月的星期数
     * @return 星期数
     */
    public static int getWeeksOfMonth() {
        LocalDate date = LocalDate.now();
        return getWeeksOfMonth(date.getYear(), date.getMonthOfYear());
    }
    /**
     * 指定月第一天的星期数
     * @param year 年
     * @param month 月
     * @return 星期数
     */
    public static int getWeekOfFistDay(int year, int month) {
        LocalDate date = new LocalDate(year, month, 1);
        return date.getDayOfWeek();
    }
    /**
     * 当前月第一天的星期数
     * @return 星期数
     */
    public static int getWeekOfFistDay() {
        LocalDate date = LocalDate.now();
        return getWeekOfFistDay(date.getYear(), date.getMonthOfYear());
    }
    /**
     * 获取指定年月的日历二维数组
     *
     * <br/> 数据按照星期日、星期一、星期二、星期三、星期四、星期五、星期六的顺序依次存放
     * @param year 年
     * @param month 月
     * @return 日历二维数组
     */
    public static String[][] getCalendarArray(int year, int month) {
        final int weeks = CalendarUtil.getWeeksOfMonth(year, month); // 月的周数
        final int daysOfWeek = 7; // 一周的天数
        String[][] calendarArray = new String[weeks][daysOfWeek]; // 日历数据
        final int daysOfMonth = CalendarUtil.getDaysOfMonth(year, month); // 月的天数
        int weekOfFirstDay = CalendarUtil.getWeekOfFistDay(year, month); // 某月1号的星期数,表示星期几
        int day = 1; // 天

        weekOfFirstDay = weekOfFirstDay == 7 ? 0 : weekOfFirstDay;
        // 填充数据到二维数组，根据weekOfFirstDay变量确定数据起始位置
        for (int i = 0; i < weeks; i++) {
            for (int j = 0; j < daysOfWeek; j++) {
                calendarArray[i][j] = StringConstant.BLANK;
                if (i == 0 && j < weekOfFirstDay) {
                    // do nothing
                } else if (i == 0 && j == weekOfFirstDay) {
                    calendarArray[i][j] = String.valueOf(day);
                    day++;
                } else if (day <= daysOfMonth) {
                    calendarArray[i][j] = String.valueOf(day);
                    day++;
                }
            }
        }

        return calendarArray;
    }
    /**
     * 获取当前年月的日历二位数组
     * @return 日历二位数组
     */
    public static String[][] getCalendarArray() {
        LocalDate now = LocalDate.now();
        return getCalendarArray(now.getYear(), now.getMonthOfYear());
    }
}
